package com.imooc.coupon.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * <h1>通用的抽象过滤器类</h1>
 */
public abstract class AbstractZuulFilter extends ZuulFilter {

    // 用于再过滤器之间传递消息, context在ThreadLocal 中，也就是每个用户都有自己的context,实质是每次请求会有对应的context，每次请求对象不一样，每次的context也不是同一个,过滤结束后context自动清理或者初始化
    RequestContext context;

    // 不同用户之间可能共享一个“next”，不同用户对特定过滤器进行启动和关闭，这些用户相互影响
    private final static String NEXT = "next";

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return (boolean) ctx.getOrDefault(NEXT, true);
    }

    @Override
    public Object run() throws ZuulException {
        context = RequestContext.getCurrentContext();
        return cRun();
    }

    protected abstract Object cRun();

    // 关闭过滤器
    Object fail(int code, String msg) {
        context.set(NEXT, false);
        context.setSendZuulResponse(false); // 表示不再经过其它过滤器，直接返回客户端,停止此次路由
        context.getResponse().setContentType("text/html;charset=UTF-8");
        context.setResponseStatusCode(code);
        context.setResponseBody(String.format("{\"result\": \"%s!\"}", msg));
        return null;
    }

    // 启用过滤器
    Object success() {
        context.set(NEXT, true);
        return null;
    }
}
